#ifndef BANK_HH
#define BANK_HH

#include <iostream>
#include <vector>
#include <string>
#include <map>
#include "CheckingAccount.hh"
#include "SavingsAccount.hh"
#include "Customer.hh"
#include "Account.hh"
#include "Transaction.hh"
#include "Utility.hh"

class Bank {
private:
    std::vector<Customer*> customers;
    std::map<std::string, Account*> accounts;
    std::vector<Transaction> transactions;

public:
    Bank();
    Bank(std::vector<Customer*> customers, std::map<std::string, Account*> accounts, std::vector<Transaction> transactions);
    ~Bank();
    Bank(const Bank& other) ;
    Bank& operator=(const Bank& other) ;

    void addCustomer(const std::string& name);
    Customer* findCustomer(const std::string& name);
    CheckingAccount* findCheckingAccount(const std::string& accountID);
    SavingsAccount* findSavingsAccount(const std::string& accountID);
    void displayAllAccounts();
    void generateReport();
    void generateCustomerReport(const std::string& customerName);
    void generateAccountReport(const std::string& accountID);
};

#endif // BANK_HH